import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;  // (Todas las clases de java.util se utiliza la lista solamente)

/**
 * En esta clase mundo se crean todos los objetos de las clases del juego se agregan al mundo en el tiempo que se
 * tienen que agregar y tambien se eliminan
 * 
 * @author Andres Tovar Jaime
 * @version 1 30-11-2012
 */
public class Mundo extends World
{
    public Jugador jug; //objeto de la clase jugador 
    private Bala1 bala1;//objeto de la clase Bala1 para inicializar todas las balas del juego
    private int nivel=0,vel =1;//variables donde se indica el nivel (depende del nivel son los obejtos que se agregan al 
                               //mundo e indica la velocidad del zombie 
    private List lista;    //Una lista de Java donde guardan los zombies en el mundo; si esta vacia se avanza de nivel 
                           //o se acaba el juego segun sea el caso
    private SimpleTimer timer=new SimpleTimer(); //contador
    private SimpleTimer timer2=new SimpleTimer(); //contador
    private marcadorBala marcador; //objeto de la clase marcadorBala para mostrar en el juego el numero de balas que se tiene
    private marcadorVidas marcadorb;//objeto de la clase marcadorVidas para mostrar en el juego el numero de vidas que se tiene
    private instrucciones2 ins2; //objeto de la clase instrucciones2 (controles) para agregarla y el jugador los vea
    private instrucciones1 ins1; //objeto de la clase instrucciones1 (ayuda) para agregarla y el jugador la vea
    private Presentacion pres; //objeto de la clase Presentacion que es la presentacion del juego 
    private Nivel1 primero; //objeto de la clase primero que es la pantalla del primer nivel
    private Nivel2 segundo; 
    private Nivel3 tercero;
    private Fin ultimo=new Fin();  //es la pantalla que anuncia que ganaste y muesra los creditos
    private Perdiste per=new Perdiste();  //es la pantalla que muestra que perdiste y muestra los creditos
    
    /**
     * Constructor de objetos de la clase Mundo.
     * 
     */
    public Mundo()
    {    
        // Create a new world with 600x400 cells with a cell size of 1x1 pixels.
        super(700, 500, 1);
        marcador=new marcadorBala();
        marcadorb=new marcadorVidas();
        pres=new Presentacion();
        ins1=new instrucciones1(pres);
        ins2=new instrucciones2(ins1);   
        primero=new Nivel1(ins2);
        segundo=new Nivel2(primero);
        tercero=new Nivel3(segundo);
        jug=new Jugador(marcador,marcadorb);
        bala1=new Bala1(jug);
        prepare();
    }
     /**
      * Act de la clase mundo que checa el nivel
      */
    public void act()
    {
       checarNivel();
    }
    /**
     * regresa la primera bala disparada
     */
    public Bala1 dameBala()
    {
        return bala1;
    }

    /**
     * Crea los objetos, los inicializa y los agrega al mundo (pantallas de presentacion)
     */
    private void prepare()
    {
        addObject(primero,350,250);
        addObject(ins2,350,250);
        addObject(ins1,350,250);
        addObject(pres,350,250);
    }
              
    /**
     * Crea los objetos, los inicializa y los agrega al mundo (nivel 1)
     */
    public void prepare2()
    {
        nivel=1;
        addObject(jug, 315, 304);
        Piedra piedra = new Piedra();
        addObject(piedra, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra2 = new Piedra();
        addObject(piedra2, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra3 = new Piedra();
        addObject(piedra3,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra4 = new Piedra();
        addObject(piedra4,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra5 = new Piedra();
        addObject(piedra5,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Arbol arbol = new Arbol();
        addObject(arbol,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra6 = new Piedra();
        addObject(piedra6, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra7 = new Piedra();
        addObject(piedra7, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra8 = new Piedra();
        addObject(piedra8, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra9 = new Piedra();
        addObject(piedra9, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra10 = new Piedra();
        addObject(piedra10, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra11 = new Piedra();
        addObject(piedra11,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra12 = new Piedra();
        addObject(piedra12, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra13 = new Piedra();
        addObject(piedra13, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Piedra piedra14 = new Piedra();
        addObject(piedra14, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        cajaDeBalas caja1=new cajaDeBalas();
        addObject(caja1,100,324);
        kitSalud caja2=new kitSalud();
        addObject(caja2,325,100);
        Zombie zombie1=new Zombie(jug);
        addObject(zombie1,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie2=new Zombie(jug);
        addObject(zombie2,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie3=new Zombie(jug);
        addObject(zombie3,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie4=new Zombie(jug);
        addObject(zombie4,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie5=new Zombie(jug);
        addObject(zombie5,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        addObject(marcador,100,20);
        addObject(marcadorb,200,20);
    }
    /**
     * Crea los objetos, los inicializa y los agrega al mundo (nivel 2)
     */
    public void prepare3()
    {
        
        
        ZombieFuego zombie6=new ZombieFuego(jug);
        addObject(zombie6,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie7=new ZombieFuego(jug);
        addObject(zombie7,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie8=new ZombieFuego(jug);
        addObject(zombie8,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie9=new ZombieFuego(jug);
        addObject(zombie9,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie10=new ZombieHielo(jug);
        addObject(zombie10,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie11=new ZombieHielo(jug);
        addObject(zombie11,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie12=new ZombieHielo(jug);
        addObject(zombie12,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie13=new ZombieHielo(jug);
        addObject(zombie13,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Espinas espinas=new Espinas();
        addObject(espinas, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Espinas espinas2=new Espinas();
        addObject(espinas2, Greenfoot.getRandomNumber(450),Greenfoot.getRandomNumber(250));
        Espinas espinas3=new Espinas();
        addObject(espinas3, Greenfoot.getRandomNumber(450),Greenfoot.getRandomNumber(250));
        

    }
    /**
     * Crea los objetos, los inicializa y los agrega al mundo (nivel 3)
     */public void prepare4()
    {
        
        ZombieFuego zombie6=new ZombieFuego(jug);
        addObject(zombie6,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie7=new ZombieFuego(jug);
        addObject(zombie7,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie8=new ZombieFuego(jug);
        addObject(zombie8,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieFuego zombie9=new ZombieFuego(jug);
        addObject(zombie9,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie10=new ZombieHielo(jug);
        addObject(zombie10,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie11=new ZombieHielo(jug);
        addObject(zombie11,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie12=new ZombieHielo(jug);
        addObject(zombie12,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        ZombieHielo zombie13=new ZombieHielo(jug);
        addObject(zombie13,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Espinas espinas=new Espinas();
        addObject(espinas, Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
         Espinas espinas2=new Espinas();
        addObject(espinas2, Greenfoot.getRandomNumber(450),Greenfoot.getRandomNumber(250));
         Espinas espinas3=new Espinas();
        addObject(espinas3, Greenfoot.getRandomNumber(450),Greenfoot.getRandomNumber(250));
        Zombie zombie1=new Zombie(jug);
        addObject(zombie1,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie2=new Zombie(jug);
        addObject(zombie2,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie3=new Zombie(jug);
        addObject(zombie3,Greenfoot.getRandomNumber(650),Greenfoot.getRandomNumber(450));
        Zombie zombie4=new Zombie(jug);
    }
    
    /**
     * metodo que remueve al jugador en el momento que a este lo matan
     */
    public void meMataron()
    {
        removeObject(jug);
        addObject(per,350,250);
        Greenfoot.stop();
    }
    
    /**
     * Checa en que nivel esta llama al prepare necesario para agregar los objetos y revisa que aun halla zombies
     * (en el momento que ya no halla prepara el siguiente nivel)
     */
    public void checarNivel()
    {
        
        if(nivel==1)
        {
           
            lista=getObjects(Zombies.class);
            if(lista.isEmpty())
            {
                addObject(segundo,350,250);
                if(Greenfoot.mouseClicked(null) && primero.listo()==true)
                {
                removeObject(segundo);
                prepare3();
                vel =1;
                nivel++;
                }
                
            }
        }
        
        if(nivel==2)
        {
            
            lista=getObjects(Zombies.class);
            if(lista.isEmpty())
            {
                segundo.yaAcabo=true;
                addObject(tercero,350,250);
                if(Greenfoot.mouseClicked(null) && segundo.yaAcabo==true)
                {
                removeObject(tercero);
                prepare4();
                vel =1;
               nivel ++;
                }
            }
        }
        
        if(nivel==3)
        {
            lista=getObjects(Zombies.class);
            if(lista.isEmpty())
            {
                addObject(ultimo,350,250);
                Greenfoot.stop();
                
            }
        }
}
    /**
     * calcula la velocidad de los zombies despues de cada 10 segundos hace a los zombies mas rapidos
     */
    public int dameVelocidad()
    {
        if(timer.millisElapsed() >= 100000 )
        {   
            timer.mark();
            return ++vel;
        }
        return vel;
    }
}
